/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica;

import fisica.CapaFisica;
import fisica.UsuarioFisica;
import hibernate.objeto.Paciente;
import hibernate.objeto.Persona;
import hibernate.objeto.Usuario;
import java.util.Vector;
import presentacion.MenuPrincipal;
import presentacion.utilidad.MensajePresentacion;

/**
 *
 * @author Rafael
 */
public class UsuarioLogica extends CapaLogica {

    /**
     * Crea y persiste el usuario.
     *
     * @param datosUsuario Los datos de la usuario
     * @param usuario El usuario que se esta agregando/modificando
     * @param idUsuario El arreglo en donde se guarda el id del objeto
     * Usuario creado para su posterior recuperación
     * @return true si se agregó/modificó correctamente, false en caso contrario
     */
    public static boolean agregarOModificarUsuario(String[] datosUsuario,
            Usuario usuario, int[] idUsuario){
        //Crea el objeto
        usuario = crearObjetoUsuario(datosUsuario, usuario);

        //Persiste el objeto
        if (CapaFisica.guardarOActualizarObjeto(usuario)) {
            idUsuario[0] = usuario.getIdUsuario();
            return true;
        } else {
            return false;
        }
    }

    /**
     * Crea y persiste el usuario paciente.
     *
     * @param paciente El paciente a quien se le crea el usuario
     * @return true si se agregó/modificó correctamente, false en caso contrario
     */
    public static boolean agregarOModificarUsuarioPaciente(Paciente paciente){
        //Crea el objeto
        Usuario usuario = crearObjetoUsuarioPaciente(paciente);

        //Persiste el objeto
        if (CapaFisica.guardarOActualizarObjeto(usuario)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Crea/modifica un objeto usuario con los datos pasados por parámetro.
     *
     * @param datosUsuario Los datos del usuario
     * @param usuario El usuario que se esta agregando/modificando
     * @return El objeto Usuario creado
     */
    private static Usuario crearObjetoUsuario(String[] datosUsuario,
            Usuario usuario) {
        Usuario usuarioExistio = UsuarioFisica.getUsuarioPorDocumentoYPorEnBd(
                datosUsuario[CapaLogica.PERSONA_TIPO_DE_DOCUMENTO].toString(),
                datosUsuario[CapaLogica.PERSONA_NUMERO_DE_DOCUMENTO].toString(),
                false);

        //Si esta dada como baja lógica se la reactiva para luego seguir
        //modificándola
        if (usuarioExistio != null) {
            usuarioExistio.setEnBdUsuario(true);
            usuario = usuarioExistio;
        }
        //Si se trata de un alta crea el objeto
        if (usuario == null) {
	    usuario = new Usuario();
        }

        //Agrega el objeto persona
        int[] idObjetoCreado = new int[1];
        Persona persona = PersonaLogica.getPersonaPorDocumentoEnBd(
                datosUsuario[PERSONA_TIPO_DE_DOCUMENTO].toString() + " " +
                datosUsuario[PERSONA_NUMERO_DE_DOCUMENTO].toString());
        PersonaLogica.agregarOModificarPersona(datosUsuario, persona,
                idObjetoCreado);

        //Vinculo la persona al usuario
        usuario.setPersona(PersonaLogica.getPersonaPorIdYEnBd(
                idObjetoCreado[0]));

        //Continúa seteando los valores adicionales para paciente
        usuario.setAdministradorUsuario(
                Boolean.valueOf(datosUsuario[USUARIO_ES_ADMINISTRADOR]));
        
        usuario.setNombreDeUsuarioUsuario(
                datosUsuario[USUARIO_NOMBRE_DE_USUARIO]);

        usuario.setClaveUsuario(
                datosUsuario[USUARIO_CLAVE]);

        usuario.setTipoDeAccesoUsuario(
                datosUsuario[USUARIO_TIPO_DE_ACCESO]);

        usuario.setMatriculaMedicaUsuario(
                datosUsuario[USUARIO_MATRICULA_MEDICA]);

        usuario.setTelefonoInternoUsuario(
                datosUsuario[USUARIO_TELEFONO_INTERNO]);

        usuario.setComentarioUsuario(
                datosUsuario[USUARIO_COMENTARIOS]);

        usuario.setEnBdUsuario(true);

        return usuario;
    }

    /**
     * Crea/modifica un objeto usuario paciente con los datos pasados por parámetro.
     *
     * @param paciente El paciente a quien se le crea el usuario
     * @return El objeto Usuario creado
     */
    private static Usuario crearObjetoUsuarioPaciente(Paciente paciente) {
        Usuario usuario = UsuarioLogica.getUsuarioPorNombreDeUsuarioYEnBd(
                paciente.getPersona().getNumeroDeDocumentoPersona());
        //Si no tenia usuario lo crea
        if (usuario == null) {
            usuario = new Usuario();
        }

        //Vinculo la persona al usuario
        usuario.setPersona(paciente.getPersona());

        //Continúa seteando los valores adicionales para paciente
        //Nombre de usuario: Por defecto el número de documento
        usuario.setNombreDeUsuarioUsuario(
                paciente.getPersona().getNumeroDeDocumentoPersona());
        
        //Clave: Por defecto una cadena aleatoria de 6 caracteres de longitud
        usuario.setClaveUsuario(
                generarStringAleatorio(6));

        usuario.setAdministradorUsuario(false);

        usuario.setTipoDeAccesoUsuario(
                "Paciente");
        
        usuario.setMatriculaMedicaUsuario(
                null);
        
        usuario.setTelefonoInternoUsuario(
                null);
        
        usuario.setComentarioUsuario(
                "Generado automáticamente por el sistema.");

        usuario.setEnBdUsuario(true);

        return usuario;
    }

    /**
     * Elimina logicamente al usuario de la bd.
     *
     * @param usuario El usuario a eliminar
     * @return true si se eliminó correctamente, false en caso contrario
     */
    public static boolean eliminarUsuario(Usuario usuario) {
        //Se elimina si es q no es Paciente
        if (usuario != MenuPrincipal.usuarioActivo) {
            if (!usuario.getTipoDeAccesoUsuario().equalsIgnoreCase("Paciente")) {
                //Elimina el usuario
                usuario.setEnBdUsuario(false);

                if (CapaFisica.guardarOActualizarObjeto(usuario)) {
                    return true;
                } else {
                    return false;
                }
        //Errores
            } else {
                MensajePresentacion.informarImposibilidadEliminarUsuario();
                return false;
            }
        } else {
            MensajePresentacion.informarImposibilidadEliminarUsuario();
            return false;
        }
    }

    /**
     * Retorna el objeto Usuario según el id.
     *
     * @param idUsuario El id del usuario
     * @return El objeto Usuario consultado, null si no existe
     */
    public static Usuario getUsuarioPorId(int idUsuario) {
        return UsuarioFisica.getUsuarioPorId(idUsuario);
    }

    /**
     * Retorna un objeto usuario según el número de documento.
     *
     * @param numeroDocumento El número de documento
     * @return El objeto Usuario consultado
     */
    public static Vector<Usuario> getVectorUsuarioPorNumeroDocumentoYEnBd(
            String numeroDocumento) {
        return UsuarioFisica.getVectorUsuarioPorNumeroDocumentoYPorEnBd(
                numeroDocumento, true);
    }

    /**
     * Retorna un objeto usuario según su apellido.
     *
     * @param apellido El apellido del usuario
     * @return El objeto Usuario consultado
     */
    public static Vector<Usuario> getVectorUsuarioPorApellidoYEnBd(String apellido) {
        return UsuarioFisica.getVectorUsuarioPorApellidoYPorEnBd(
                reemplazarUnApostrofoPorDosApostrofos(apellido), true);
    }

    /**
     * Retorna un usuario por nombre de usuario en la base de datos.
     *
     * @param nombreDeUsuario El nombre de usuario
     * @return El objeto Usuario consultado, null si no existe
     */
    public static Usuario getUsuarioPorNombreDeUsuarioYEnBd(String nombreDeUsuario) {
        return UsuarioFisica.getUsuarioPorNombreDeUsuarioYPorEnBd(
                nombreDeUsuario, true);
    }

    /**
     * Verifica si existe un usuario por nombre de usuario en la base de datos.
     *
     * @param nombreDeUsuario El nombre de usuario
     * @return true si existe, false en caso contrario
     */
    public static boolean existeUsuarioPorNombreDeUsuarioEnBd(String nombreDeUsuario) {
        return (UsuarioFisica.getUsuarioPorNombreDeUsuarioYPorEnBd(
                nombreDeUsuario, true) != null);
    }

    /**
     * Retorna un usuario por tipo y número de documento en la base de datos.
     *
     * @param tipo El tipo de documento
     * @param numero El número de documento
     * @return El objeto Usuario consultado, null si no existe
     */
    public static Usuario getUsuarioPorDocumentoEnBd(String tipo, String numero){
        return (UsuarioFisica.getUsuarioPorDocumentoYPorEnBd(tipo, numero, true));
    }


    /**
     * Verifica si existe un usuario por tipo y número de documento en la base de datos.
     *
     * @param tipo El tipo de documento
     * @param numero El número de documento
     * @return true si existe, false en caso contrario
     */
    public static boolean existeUsuarioPorDocumentoEnBd(String tipo, String numero){
        return (UsuarioFisica.
                getUsuarioPorDocumentoYPorEnBd(tipo, numero, true) != null);
    }

    /**
     * Retorna un usuario por correo electrónico en la base de datos.
     *
     * @param correoElectronico El correo electrónico del usuario
     * @return El objeto Usuario consultado, null si no existe
     */
    public static Usuario getUsuarioPorCorreoElectronicoEnBd(String correoElectronico) {
        return UsuarioFisica.getUsuarioPorCorreoElectronicoEnBd(
                correoElectronico, true);
    }

    /**
     * Retorna el texto HTML correspondiente a la descripcion del/los usuario/s.
     *
     * @param usuario El usuario
     * @return El String que contiene el HTML
     */
    public static String getUsuarioHTML(Usuario usuario) {
        String usuarioHTML = "";
        Vector<Usuario> vectorUsuario = new Vector<Usuario>();
        
        if (usuario != null) {
            vectorUsuario.add(usuario);
        } else {
            vectorUsuario = getVectorUsuarioPorApellidoYEnBd("");
        }

        if (vectorUsuario != null) {
            for (int i = 0; i < vectorUsuario.size(); i++) {
                usuarioHTML +=
                        "<font size=\"3\" face=\"arial\" color=\"blue\">USUARIO</font><br> " +
                        "<font size=\"3\" face=\"arial\" color=\"black\">Nombre de usuario: </font>"
                        + "<font size=\"3\" face=\"arial\">" +
                        vectorUsuario.get(i).getNombreDeUsuarioUsuario() + "</font><br>" +
                        "<font size=\"3\" face=\"arial\" color=\"black\">Clave: </font>"
                        + "<font size=\"3\" face=\"arial\">" +
                        vectorUsuario.get(i).getClaveUsuario() + "</font><br>" +
                        "<font size=\"3\" face=\"arial\" color=\"black\">Administrador de usuarios: </font>";
                        if (vectorUsuario.get(i).isAdministradorUsuario()) {
                            usuarioHTML += "<font size=\"3\" face=\"arial\">" + "si" + "</font><br>";
                        } else {
                            usuarioHTML += "<font size=\"3\" face=\"arial\">" + "no" + "</font><br>";
                        }
                        usuarioHTML += "<font size=\"3\" face=\"arial\" color=\"black\">Tipo de acceso: </font>"
                        + "<font size=\"3\" face=\"arial\">" +
                        vectorUsuario.get(i).getTipoDeAccesoUsuario() + "</font><br>";
                        if (vectorUsuario.get(i).getMatriculaMedicaUsuario() != null) {
                            usuarioHTML +=
                                    "<font size=\"3\" face=\"arial\" color=\"black\">Matrícula médica: </font>"
                                    + "<font size=\"3\" face=\"arial\">" +
                                    vectorUsuario.get(i).getMatriculaMedicaUsuario() + "</font><br>";
                        }
                        usuarioHTML +=
                                PersonaLogica.getPersonaHTML(vectorUsuario.get(i).getPersona());
                        if (vectorUsuario.get(i).getTelefonoInternoUsuario() != null) {
                            usuarioHTML +=
                                    "<font size=\"3\" face=\"arial\" color=\"black\">Telefono interno: </font>"
                                    + "<font size=\"3\" face=\"arial\">" +
                                    vectorUsuario.get(i).getTelefonoInternoUsuario() + "</font><br>";
                        }

                        usuarioHTML +=
                                "<font size=\"3\" face=\"arial\" color=\"black\">Comentarios </font><br>"
                                + "<font size=\"3\" face=\"arial\">" +
                                vectorUsuario.get(i).getComentarioUsuario() + "</font><br>";
            }
        } else {
            usuarioHTML =
                    "<font size=\"3\" face=\"arial\" color=\"blue\">USUARIOS</font><br> " +
                    "<font size=\"3\" face=\"arial\">No posee</font><br></font>";
        }

        return usuarioHTML;
    }

}
